package com.kfm.base.io.b;

import java.io.*;

public class FileCutter {

    public static void main(String[] args) {
        File file = new File("d:/io/可惜没如果.mp4");
        long size = 1024 * 1024 * 5;
        File dir = new File("d:/io", "cutter");

        int count = split(file, size, dir);
        System.out.println(count);
    }


    /**
     * 将文件进行切割
     *
     * @param original  参数 original 表示被拆分的原始文件
     * @param size      参数 size 表示拆分后的文件的体积上限
     * @param directory 参数 directory 表示拆分后的文件的存储目录
     * @return
     */
    public static int split(final File original, final long size, final File directory) {
        // 参数校验
        if (original == null || !original.isFile()) {
            return 0;
        }

        // 输出文件夹是否存在
        if (!directory.exists()){
            directory.mkdirs();
        }

        int count = 0; // 拆分文件的数量
        try (FileInputStream fis = new FileInputStream(original)) {
            // 单文件大小一个数组能读取到范围
            if (size <= Integer.MAX_VALUE - 8){
                byte[] bytes = new byte[(int) size];
                int readSize;
                while(fis.available() != 0){
                    // readSize 读取的字节数
                    readSize = fis.read(bytes);
                    // new File("d:/io", "a.txt"); d:/io/a.txt
                    File outFile = new File(directory, count++ + ".kfm");
//                    File outFile = new File(directory, System.currentTimeMillis() + ".kfm");
//                    count++;
                    // 用输出流创建子文件
                    FileOutputStream fos = new FileOutputStream(outFile);

                    fos.write(bytes, 0, readSize);

                    System.out.println("分隔文件：" + outFile);
                    fos.close();
                }

            } else {
                // 一次读取不能完整读取一个文件  size > Integer.MAX_VALUE

                // 当前被分隔的文件是否以分隔完毕
                while(fis.available() != 0){ // 没循环一个会创建一个子文件
                    // 用输出流创建子文件
                    File outFile = new File(directory, count++ + "");
                    FileOutputStream fos = new FileOutputStream(outFile);

                    long sum = size; // 单文件大小

                    while (sum > Integer.MAX_VALUE - 8 && fis.available() != 0){
                        byte[] bytes = new byte[Integer.MAX_VALUE - 8];
                        int readSize = fis.read(bytes);

                        fos.write(bytes, 0, readSize);

                        sum -= readSize;
                    }

                    // 没有满足单文件大小, 还有内容没读取
                    if (fis.available() != 0){
                        byte[] bytes = new byte[(int) sum];
                        int readSize = fis.read(bytes);

                        fos.write(bytes, 0, readSize);
                    }

                    fos.close();
                }

            }
        } catch (Exception e){
            e.printStackTrace();
        }
        return count;
    }
}
